(* some sample programs *)
val exp3 = NumExp 3;
val exp4 = NumExp 4;
val expI = IdExp "i";
val expJ = IdExp "j";
val exp7 = OpExp(exp3, Plus, exp4);
val expI3 = OpExp(expI, Plus, exp3);

val prog1  = AssignStm ("i", exp3);
val prog2  = AssignStm ("j", expI);
val prog3  = AssignStm ("j", exp7);
val prog4  = CompoundStm (prog1, prog2);
val prog5  = AssignStm ("j", expI3);
val prog6  = CompoundStm (prog4, prog5);
val prog7  = PrintStm [];
val prog8  = PrintStm [exp3];
val prog9  = PrintStm [exp3, exp4];
val prog10 = PrintStm [exp3, exp4, exp7];
val prog11 = PrintStm [EseqExp (prog6, expI3), expI];
val prog12 = PrintStm [EseqExp (prog6, EseqExp (prog7, expJ)), expJ];
val prog13 = PrintStm [EseqExp (prog11, EseqExp (prog10, expI))];
val prog14 = PrintStm [EseqExp (prog13, expI), expI3, EseqExp (prog10, expJ), exp3];

(* The sample program from the book
         a := 5 + 3
       ; b := ( print (a, a-1)
                , 10 * a )
       ; print (b)                   *)
val stm1 = AssignStm("a", OpExp(NumExp 5, Plus, NumExp 3));
val stm2 = AssignStm("b", EseqExp(PrintStm[IdExp "a",
					   OpExp(IdExp "a", Minus, NumExp 1)],
				  OpExp(NumExp 10, Times, IdExp "a")));
val stm3 = PrintStm[IdExp "b"];

val prog15 = CompoundStm(stm1, CompoundStm(stm2, stm3));
val prog16 = CompoundStm(CompoundStm(stm1, stm2), stm3);

